/* *
 *  本例子主要表明C++与Java的指针,引用的特点
 *
 * */

#include <iostream>

class User {
public:
    int age;
    User() {}
};
/* *
 *  user_arg本质就是方法栈的一个局部变量(指针), 并不是传进来的那个变量本身, 而是一份拷贝,
 *  只是 user_arg和user1他们保存的值相等, 即age=1那个块User堆的地址,
 *  而->这个操作符操作的是指向的那个堆, user_arg->age 等价于 *(user_arg).age ;
 * */
void change_obj(User *user_arg) {
    User *tmpUser = new User();
    tmpUser->age = 12;
    user_arg = tmpUser;     // 这样做是无法改变age的
}


/* *
// 该函数就是上面的函数的Java版本, 完全等价
void change_obj_Java(User user_arg) {
    User tmpUser = new User();
    tmpUser.age = 12;
    user_arg = tmpUser;
}
*/

/* *
 *  Java和C++的区别就在这个函数, 核心就是因为c++有"*"这个取值符.
 *  Java和C++中, Java的"."等价于C++的"->", 所以上面的change_obj才有Java的等价版本;
 *  因为Java没有取值符, 所以本函数用Java无法实现!
 * */
void change_value(int *value_arg) {
    int tmpValue = 99;
    *value_arg = tmpValue;
}


int main() {
    User *user1 = new User();
    user1->age = 1;
    change_obj(user1);
    std::cout<< user1->age;     // 输出结果为: 1
    return 0;
}

